package com.zdk.springcloudorder.service;




import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * @author quavario@gmail.com
 * @date 2021/11/30 15:41
 */
@FeignClient(name = "spring-cloud-stock")
public interface ClientUtil {


    /**
     *     TODO feign在get请求时不加@RequestParam(name = "name") 会被认为时post请求,具体原因请查看这个地址 https://blog.csdn.net/qq_40233503/article/details/104981465
     *     TODO 因为FeignClient最后是用HttpURLConnectiion发起的网络连接，在发起的过程中，Connection会判断其自身的body是否为空，如果不为空，则将 GET Method 转换为 POST Method。
     *     TODO 这也容易理解，因为body数据只能放在RquestBody内以流的形式传输，而param数据则在Http协议中直接放在URL上进行传输和获取，所以如果有body数据，理应转为POST请求，这也每种数据都能正确的传输到网络接口。
     *     TODO 但是，我们的服务端生产者是Get请求的接口，这样直接就会导致请求类型不一致报405，而为什么会造成转换，是因为body数据不为空，但是为什么body会有值，这要从初始化FeignClient和FeignClient的规则说起。
     *     TODO 在启动过程中，就将FeignClient注解的类进行动态代理，且初始化了代理类。
     *     TODO 1:如果有@RequestParam(“xx”)注解，则会将参数作为key，放入RequestTemplate.Factory中，由urlIndex来指明数组索引，并且在解析的时候，根据每个key从arg数组获取到具体值，拼接在url后面；
     *     TODO 2:如果没有任何注解，或者用@RequestBody贴在参数前面，则初始化RequestTemplate.Factory的时候，bodyIndex会维护参数索引，并且bodyType这个参数会携带参数类型
     */
    @GetMapping("stock/test")
    String stockTest(@RequestParam(name = "name") String name);
}
